#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <vector>

#define MAX_SIGNUM 31

using namespace std;

static vector<int> sigarr = {2};

static void show_pending(const sigset_t& pending)
{
    for(int signo = MAX_SIGNUM; signo >= 1;signo--)
    {
        if(sigismember(&pending,signo))
        {
            cout<<"1";
        }
        else
        {
            cout<<"0";
        }
    }
    cout<<"\n";
}

static void wode(int signal)
{
    cout<< signal <<" 号信号已经被抵达！！！"<<endl;
}

int main()
{   
    for(const auto& sig :sigarr)
    {
        signal(sig, wode);
    }

    //1、先尝试屏蔽指定的信号
    sigset_t block, oblock,pending;

    //初始化
    sigemptyset(&block);
    sigemptyset(&oblock);//初始化全0
    sigemptyset(&pending);//初始化全0

    //添加要屏蔽的信号
    for(const auto& sig :sigarr)
    {
        sigaddset(&block,sig);
    }

    //开始屏蔽
    sigprocmask(SIG_SETMASK,&block,&oblock);

    int cnt = 10;
    //遍历打印pending信号集
    while(true)
    {
        sigemptyset(&pending);//初始化全0

        sigpending(&pending);//输出pending表

        //打印
        show_pending(pending);

        sleep(1);
        
        if((cnt--) == 0)
        {
            cout<< "恢复对信号的屏蔽，不屏蔽任何信号\n";
            sigprocmask(SIG_SETMASK,&oblock,&block);
        }
    }

    return 0;
}



